#ifndef _Pipe_H_
#define _Pipe_H_

#include <vector>
#include <thread>
#include <string>
#include <memory>
#include <fstream>
#include <map>
#include <sys/types.h>
#include <Python.h>
#include "function.h"
#include "profile.h"
#include "data.h"
#include "memory.h"
#include "queue.hpp" 
#include "app.h"

namespace sp{

// class declear
class Function;
class Profile;
class App;

class Executor{
protected:
    short id;                                      // Executor的id
    short lcore_id;                                // 绑定的核号, 默认亲和的核是id%(NUM_CORES)
    short gpu_id;                                  // 只有GpuExecutor会有，绑定的GPU id
    pid_t pid;                                     // 进程pid
    BlockingQueue<char>* receiver;                 // 与主进程之间的命令管道，负责接收命令
    BlockingQueue<char>* sender;                   // 与主进程之间的命令管道，负责发送状态
    std::string name;                              // Excutor的functions字符串拼接
    std::vector<Function*> functions;              // 包含的所有function
    SharedMemoryManager* sharedMemory;             // 每个executor有一个共享内存的管理类
    Gpu_SharedMemoryManager* gpu_sharedMemory;     // 如果含有GpuFunction，则有gpu_SharedMemoryManager对象
    bool Python_Executor;                          // 有PythonFunction的Executor
    bool Gpu_Executor;                             // 有GPUFunction的Function
    Profile* profile;                              // 指向profile
    App* app;                                      // 指向app
    bool willBindLcore;                            // 是否会绑定逻辑核

public:
    std::ofstream fout;                            // 日志，文件输出
    Executor(App* app, short id, std::vector<Function*> functions, BlockingQueue<char>* receiver, BlockingQueue<char>* sender);
    Executor(App* app, short id, std::vector<Function*> functions, BlockingQueue<char>* receiver, BlockingQueue<char>* sender, bool willBindLcore);
    ~Executor();
    bool hasPythonFunction();
    bool hasGpuFunction();
    short getId();
    pid_t getPid();
    std::string getName();
    void setGpuId(short id);
    void bindSharedMemoryManager(SharedMemoryManager* sharedMemory);
    void bindGpuSharedMemoryManager(Gpu_SharedMemoryManager* gpu_sharedMemory);
    void start();                         // 开始进程的执行
    void addFunction(Function* function); // 添加function
    void delFunction(std::string name);   // 移除function
    char* malloc(uint8_t type);
    char* malloc(int width, int height);
    char* malloc(size_t size);
    void free(char* ptr);
    void freeAll(Data* ptr);                     // 只接收Data*形式的地址，free掉所有关联的内存。
    Profile* getProfile();                       // 获取profile对象。
    App* getApp();                               // 获取app对象。
    short getStreamId(size_t pos);               // 获取streamId。
    size_t getDeviceMemoryPos(short stream_id);  // 获取stream显存起始地址。
    size_t getDeviceMemorySize(short stream_id); // 获取stream大小。
    short mallocDeviceMemory();                  // 获取一个空闲的stream，=-1说明没有malloc成功
    void freeDeviceMemory(short stream_id);      // 释放掉此stream
    // 打印方法
    void check();
    void printMsg();
    // 进行运行
    void run();
};

};

#endif